#列举出需求和需求关系
from text2text import text2text
import json
from string_to_list import string_to_list
from merge_workflows import run
from md_utils import read_md_file
import time
def requirements_gathering(user_input):

    knowledge = read_md_file("task_knowledge_base.md")

    prompt = f"""
    {knowledge}

    <用户需求>
    {user_input}
    </用户需求>
    工作步骤：
    1.用户需求中有可能只有一个需求，或者是多个子需求共同组成，明确用户子需求的数量，得出子需求列表。
    1.针对用户的每个子需求，明确最相关的任务类型，得出任务类型列表(严格遵照候选类型名，不得任何改变，也不准多出空格)。注意：一个子需求只能对应一个任务类型，且至少要有一个任务类型。
    2.针对用户需求和任务列表，且依据输入输出类型，判断任务列表之间的依赖关系，例如图生3D依赖图生图，图生视频依赖图生图。
    
    
    """
    
    return text2text(prompt)

    pass
def task_type_division(requirements):
    """
    任务类型分类，理解需求，将不同的需求划分到不同的任务池
    """

    prompt = f"""
    <text>{requirements}</text>
    仔细理解text中的内容，划分任务类型。
    任务类型可选项：文生文，文生图，图生图,文生视频,图生视频,图生3D。
    输出不同的任务类型及对应的内容。
    example:
    input:
    <text>要一段关于未来城市的基本介绍文字，包括城市的主要特色、建筑风格、交通方式、居民生活等方面，字数不少于 500 字。
    然后根据未来城市的建筑风格和居民生活，编写一个该城市下的海绵城市建设方案，400字。
    要两张未来城市的关键场景图。一张是未来城市的全景图，展示城市的整体布局和标志性建筑，分辨率不低于 1k 。
    另一张是未来城市中一个具有代表性的居民生活区场景图，展示居民的日常生活和周边环境，分辨率不低于 1920×1080 像素。图像风格要求具有科技感和未来感，色彩鲜艳，细节丰富。
    制作一段未来城市宣传视频。视频要包含对城市特色和居民生活的介绍。
    生成一段时长为 30 秒的未来城市宣传旁白音频，音频格式为 MP3，采样率不低于 44100Hz，比特率不低于 192kbps。旁白要求语音清晰、语速适中、富有感情，能够准确传达未来城市的特色和魅力.</text>
    output:
    文生文：要一段关于未来城市的基本介绍文字，包括城市的主要特色、建筑风格、交通方式、居民生活等方面，字数不少于 800 字。
    然后根据未来城市的建筑风格和居民生活，编写一个该城市下的海绵城市建设方案，400字。
    文生图：要两张未来城市的关键场景图。一张是未来城市的全景图，展示城市的整体布局和标志性建筑，分辨率不低于 1k 。
    另一张是未来城市中一个具有代表性的居民生活区场景图，展示居民的日常生活和周边环境，分辨率不低于 1920×1080 像素。图像风格要求具有科技感和未来感，色彩鲜艳，细节丰富。
    文生视频：制作一段未来城市宣传视频。视频要包含对城市特色和居民生活的介绍。
    文生音频：生成一段时长为 30 秒的未来城市宣传旁白音频，音频格式为 MP3，采样率不低于 44100Hz，比特率不低于 192kbps。旁白要求语音清晰、语速适中、富有感情，能够准确传达未来城市的特色和魅力.
    """
    return text2text(prompt)
## 需求结构化
def requirements_structuring(requirements):
    prompt = f"""
    {requirements}
    对以上内容，直接输出为列表，注意：没有前驱依赖的，索引为-1，格式为：
    [["任务类型名","子需求",依赖的索引],[],[],......]
    """
    return text2text(prompt)

    pass
def prompt_construction(requirements_structuring_list):
    prompt_knowledge = read_md_file("Prompt_construction_methods.md")
    prompt = f"""
    <prompt_knowledge>
    {prompt_knowledge}
    </prompt_knowledge>
    {requirements_structuring_list}
    以上是二维列表，里面的元素分别是"任务类型名","子需求",依赖的索引。
    格式为[["任务类型名","子需求",依赖的索引],[],[],......]。
    现在你要根据<prompt_knowledge>中的内容，将列表中的子需求构造为绘图提示词，保持其它内容不准变，提示词必须为英文。
    输出二维度列表，格式为:
    [["任务类型名","提示词",依赖的索引],[],[],......]
    """
    return text2text(prompt)
    pass
def task_refinement(tasks):
    """
    对任务的产物细化，具体到每一个元子产物
    """
    prompt = f"""
    <tasks>{tasks}</tasks>
    tasks中描述了不同任务类型及对应的内容，请将它们细化，具体到每一个元子任务。
    务必注意：不得对tasks中的内容进行扩展和编写，只能抽取。
    输出依然按照类型分组，每一个具体的元子任务用1，2等序号排列。
    example:
    input:
    <tasks>文生文：要一段关于未来城市的基本介绍文字，包括城市的主要特色、建筑风格、交通方式、居民生活等方面，字数不少于 800 字。
    然后根据未来城市的建筑风格和居民生活，编写一个该城市下的海绵城市建设方案，400字。
    文生图：要两张未来城市的关键场景图。一张是未来城市的全景图，展示城市的整体布局和标志性建筑，分辨率不低于 1k 。
    另一张是未来城市中一个具有代表性的居民生活区场景图，展示居民的日常生活和周边环境，分辨率不低于 1920×1080 像素。图像风格要求具有科技感和未来感，色彩鲜艳，细节丰富。
    文生视频：制作一段未来城市宣传视频。视频要包含对城市特色和居民生活的介绍。
    文生音频：生成一段时长为 30 秒的未来城市宣传旁白音频，音频格式为 MP3，采样率不低于 44100Hz，比特率不低于 192kbps。旁白要求语音清晰、语速适中、富有感情，能够准确传达未来城市的特色和魅力.
    </tasks>
    output:
    文生文: 1.未来城市的主要特色
        2.未来城市的建筑风格
        3.未来城市的交通方式
        4.未来城市的居民生活
        5.未来城市的海绵城市建设方案，400字。
    文生图:1.未来城市的全景图，展示城市的整体布局和标志性建筑，分辨率不低于 1k 。
            2.未来城市中一个具有代表性的居民生活区场景图，展示居民的日常生活和周边环境，分辨率不低于 1920×1080 像素。图像风格要求具有科技感和未来感，色彩鲜艳，细节丰富。
    文生视频:1.一段未来城市宣传视频。视频要包含对城市特色和居民生活的介绍。

    文生音频:1.一段时长为 30 秒的未来城市宣传旁白音频，音频格式为 MP3，采样率不低于 44100Hz，比特率不低于 192kbps。旁白要求语音清晰、语速适中、富有感情，能够准确传达未来城市的特色和魅力.
    """

    return text2text(prompt)
    pass

def get_requirements_relevance_cot(requirements,refined_tasks):

    prompt = f"""
    <requirements>{requirements}</requirements>
    <refined_tasks>{refined_tasks}</refined_tasks>
    理解requirements中的需求，再根据refined_tasks中的具体需求，分析不同具体需求之间的依赖关系。
    输出依赖关系分析。
    example:
    input:
    <requirements>要一段关于未来城市的基本介绍文字，包括城市的主要特色、建筑风格、交通方式、居民生活等方面，字数不少于 500 字。
    然后根据未来城市的建筑风格和居民生活，编写一个该城市下的海绵城市建设方案，400字。
    要两张未来城市的关键场景图。一张是未来城市的全景图，展示城市的整体布局和标志性建筑，分辨率不低于 1k 。
    另一张是未来城市中一个具有代表性的居民生活区场景图，展示居民的日常生活和周边环境，分辨率不低于 1920×1080 像素。图像风格要求具有科技感和未来感，色彩鲜艳，细节丰富。
    制作一段未来城市宣传视频。视频要包含对城市特色和居民生活的介绍。
    生成一段时长为 30 秒的未来城市宣传旁白音频，音频格式为 MP3，采样率不低于 44100Hz，比特率不低于 192kbps。旁白要求语音清晰、语速适中、富有感情，能够准确传达未来城市的特色和魅力.
    </requirements>
    <refined_tasks>
    文生文: 1.未来城市的主要特色
    2.未来城市的建筑风格
    3.未来城市的交通方式
    4.未来城市的居民生活
    5.未来城市的海绵城市建设方案，400字。
    文生图:1.未来城市的全景图，展示城市的整体布局和标志性建筑，分辨率不低于 1k 。
            2.未来城市中一个具有代表性的居民生活区场景图，展示居民的日常生活和周边环境，分辨率不低于 1920×1080 像素。图像风格要求具有科技感和未来感，色彩鲜艳，细节丰富。
    文生视频:1.一段未来城市宣传视频。视频要包含对城市特色和居民生活的介绍。

    文生音频:1.一段时长为 30 秒的未来城市宣传旁白音频，音频格式为 MP3，采样率不低于 44100Hz，比特率不低于 192kbps。旁白要求语音清晰、语速适中、富有感情，能够准确传达未来城市的特色和魅力.</refined_tasks>
    output:
    需求描述中提出的五项文生文任务（主要特色、建筑风格、交通方式、居民生活、海绵城市建设方案）是构建未来城市的核心内容框架，而文生图、文生视频、文生音频则是对这些文本内容的可视化、动态化和听觉化呈现。任务依赖关系的本质在于：内容生产需以逻辑连贯性和信息完整性为基础，确保各媒介的输出在主题、细节和风格上一致。
    具体依赖关系解析
    以下从内容关联性和任务目标角度逐项分析：
    文生文5（海绵城市建设方案）依赖文生文2（建筑风格）和文生文4（居民生活）
    原因：海绵城市的设计需与建筑风格（如立体绿化、渗透性材料）和居民生活方式（如水资源循环利用需求、公共空间使用习惯）紧密结合。例如：
    建筑风格决定了雨水渗透设施的集成方式（如屋顶花园、垂直绿化墙）；
    居民生活需求影响海绵设施的功能定位（如社区雨水收集系统需匹配居民的日常用水习惯）。
    文生图1（全景图）依赖文生文1（主要特色）和文生文2（建筑风格）
    原因：全景图需通过视觉语言传达城市的核心理念（如生态友好、垂直集约）和建筑形态（如模块化结构、悬浮建筑）。例如：
    主要特色（如“碳中和城市”）需通过标志性建筑（如覆盖太阳能板的摩天大楼）体现；
    建筑风格（如流线型设计、透明材料）需直接映射到图像细节中。
    文生图2（居民生活区场景图）依赖文生文4（居民生活）
    原因：生活区场景需反映居民的日常活动（如智能家居使用、社区共享空间互动）和周边环境（如绿色走廊、无人配送系统）。例如：
    文生文4中描述的“居民通过AR眼镜管理家庭能源”需转化为图像中的交互界面细节；
    生活区与海绵设施的融合（如透水路面、雨水花园）需与文生文5间接关联。
    文生视频1依赖文生文1（主要特色）和文生文4（居民生活）
    原因：宣传视频需突出城市的核心竞争力（如零碳交通、智能治理）和居民幸福感（如便捷生活、社区文化）。例如：
    主要特色通过航拍镜头展示城市整体布局；
    居民生活通过人物故事片段（如上班族使用无人驾驶舱通勤）增强情感共鸣。
    文生音频1依赖全部文生文内容
    原因：30秒旁白需浓缩所有核心信息，以语音形式覆盖城市定位（特色）、空间美学（建筑）、高效连接（交通）、人文关怀（生活）、可持续发展（海绵方案）。例如：
    需将“立体交通网络”与“模块化生态建筑”并列强调科技与自然的融合；
    需用“海绵城市”概念收尾，呼应前文对居民生活质量的承诺。
    """
    cot = text2text(prompt)

    return cot
    pass

def get_requirements_relevance(requirements,refined_tasks,cot):
    
    prompt = f"""
    <requirements>{requirements}</requirements>
    <refined_tasks>{refined_tasks}</refined_tasks>
    <cot>{cot}</cot>
    理解requirements中的需求，再根据refined_tasks中的具体需求，结合cot中的依赖关系分析，直接给出不同需求之间的依赖描述。
    example:
    input:
    <requirements>要一段关于未来城市的基本介绍文字，包括城市的主要特色、建筑风格、交通方式、居民生活等方面，字数不少于 500 字。
    然后根据未来城市的建筑风格和居民生活，编写一个该城市下的海绵城市建设方案，400字。
    要两张未来城市的关键场景图。一张是未来城市的全景图，展示城市的整体布局和标志性建筑，分辨率不低于 1k 。
    另一张是未来城市中一个具有代表性的居民生活区场景图，展示居民的日常生活和周边环境，分辨率不低于 1920×1080 像素。图像风格要求具有科技感和未来感，色彩鲜艳，细节丰富。
    制作一段未来城市宣传视频。视频要包含对城市特色和居民生活的介绍。
    生成一段时长为 30 秒的未来城市宣传旁白音频，音频格式为 MP3，采样率不低于 44100Hz，比特率不低于 192kbps。旁白要求语音清晰、语速适中、富有感情，能够准确传达未来城市的特色和魅力.
    </requirements>
    <refined_tasks>
    文生文: 1.未来城市的主要特色
    2.未来城市的建筑风格
    3.未来城市的交通方式
    4.未来城市的居民生活
    5.未来城市的海绵城市建设方案，400字。
    文生图:1.未来城市的全景图，展示城市的整体布局和标志性建筑，分辨率不低于 1k 。
            2.未来城市中一个具有代表性的居民生活区场景图，展示居民的日常生活和周边环境，分辨率不低于 1920×1080 像素。图像风格要求具有科技感和未来感，色彩鲜艳，细节丰富。
    文生视频:1.一段未来城市宣传视频。视频要包含对城市特色和居民生活的介绍。
    文生音频:1.一段时长为 30 秒的未来城市宣传旁白音频，音频格式为 MP3，采样率不低于 44100Hz，比特率不低于 192kbps。旁白要求语音清晰、语速适中、富有感情，能够准确传达未来城市的特色和魅力.
    </refined_tasks>
    <cot>需求描述中提出的五项文生文任务（主要特色、建筑风格、交通方式、居民生活、海绵城市建设方案）是构建未来城市的核心内容框架，而文生图、文生视频、文生音频则是对这些文本内容的可视化、动态化和听觉化呈现。任务依赖关系的本质在于：内容生产需以逻辑连贯性和信息完整性为基础，确保各媒介的输出在主题、细节和风格上一致。
    具体依赖关系解析
    以下从内容关联性和任务目标角度逐项分析：
    文生文5（海绵城市建设方案）依赖文生文2（建筑风格）和文生文4（居民生活）
    原因：海绵城市的设计需与建筑风格（如立体绿化、渗透性材料）和居民生活方式（如水资源循环利用需求、公共空间使用习惯）紧密结合。例如：
    建筑风格决定了雨水渗透设施的集成方式（如屋顶花园、垂直绿化墙）；
    居民生活需求影响海绵设施的功能定位（如社区雨水收集系统需匹配居民的日常用水习惯）。
    文生图1（全景图）依赖文生文1（主要特色）和文生文2（建筑风格）
    原因：全景图需通过视觉语言传达城市的核心理念（如生态友好、垂直集约）和建筑形态（如模块化结构、悬浮建筑）。例如：
    主要特色（如“碳中和城市”）需通过标志性建筑（如覆盖太阳能板的摩天大楼）体现；
    建筑风格（如流线型设计、透明材料）需直接映射到图像细节中。
    文生图2（居民生活区场景图）依赖文生文4（居民生活）
    原因：生活区场景需反映居民的日常活动（如智能家居使用、社区共享空间互动）和周边环境（如绿色走廊、无人配送系统）。例如：
    文生文4中描述的“居民通过AR眼镜管理家庭能源”需转化为图像中的交互界面细节；
    生活区与海绵设施的融合（如透水路面、雨水花园）需与文生文5间接关联。
    文生视频1依赖文生文1（主要特色）和文生文4（居民生活）
    原因：宣传视频需突出城市的核心竞争力（如零碳交通、智能治理）和居民幸福感（如便捷生活、社区文化）。例如：
    主要特色通过航拍镜头展示城市整体布局；
    居民生活通过人物故事片段（如上班族使用无人驾驶舱通勤）增强情感共鸣。
    文生音频1依赖全部文生文内容
    原因：30秒旁白需浓缩所有核心信息，以语音形式覆盖城市定位（特色）、空间美学（建筑）、高效连接（交通）、人文关怀（生活）、可持续发展（海绵方案）。例如：
    需将“立体交通网络”与“模块化生态建筑”并列强调科技与自然的融合；
    需用“海绵城市”概念收尾，呼应前文对居民生活质量的承诺。</cot>
    output:
    文生文5依赖文生文2和文生文4，
    文生图1依赖文生文1和文生文2，
    文生图2依赖文生文4，
    文生视频1依赖文生文1和文生文4
    文生音频1依赖文生文1，文生文2，文生文3，文生文4，文生文5

    """
    return text2text(prompt)

def get_task_json(refined_tasks,relevance):

    json_example = """
    {
    "tasks": [
        {
        "id": 1,
        "task_name": "文生文1",
        "task_type": "文生文",
        "content": "未来城市的主要特色",
        "dependencies": []
        },
        {
        "id": 2,
        "task_name": "文生文2",
        "task_type": "文生文",
        "content": "未来城市的建筑风格",
        "dependencies": []
        },
        {
        "id": 3,
        "task_name": "文生文3",
        "task_type": "文生文",
        "content": "未来城市的交通方式",
        "dependencies": []
        },
        {
        "id": 4,
        "task_name": "文生文4",
        "task_type": "文生文",
        "content": "未来城市的居民生活",
        "dependencies": []
        },
        {
        "id": 5,
        "task_name": "文生文5",
        "task_type": "文生文",
        "content": "未来城市的海绵城市建设方案,400字。",
        "dependencies": [
            1,
            4
        ]
        },
        {
        "id": 6,
        "task_name": "文生图1",
        "task_type": "文生图",
        "content": "未来城市的全景图，展示城市的整体布局和标志性建筑，分辨率不低于 1k 。",
        "dependencies": [
            1,
            2
        ]
        },
        {
        "id": 7,
        "task_name": "文生图2",
        "task_type": "文生图",
        "content": "未来城市中一个具有代表性的居民生活区场景图，展示居民的日常生活和周边环境，分辨率不低于 1920×1080 像素。图像风格要求具有科技感和未来感，色彩鲜艳，细节丰富。",
        "dependencies": [
            4
        ]
        },
        {
        "id": 8,
        "task_name": "文生视频1",
        "task_type": "文生视频",
        "content": "一段未来城市宣传视频。视频要包含对城市特色和居民生活的介绍。",
        "dependencies": [
            1,
            4
        ]
        },
        {
        "id": 9,
        "task_name": "文生音频1",
        "task_type": "文生音频",
        "content": "一段时长为 30 秒的未来城市宣传旁白音频，音频格式为 MP3，采样率不低于 44100Hz，比特率不低于 192kbps。旁白要求语音清晰、语速适中、富有感情，能够准确传达未来城市的特色和魅力.",
        "dependencies": [
            1,
            2,
            3,
            4,
            5
        ]
        }
    ]
    }
    """

    prompt = f"""
    <refined_tasks>{refined_tasks}</refined_tasks>
    <relevance>{relevance}</relevance>
    根据refined_tasks中任务的具体内容，和relevance中任务的依赖关系，输出一个结构化的字符串格式的json形式的数据结构。
    example:
    input:
    <refined_tasks>
    文生文: 1.未来城市的主要特色
    2.未来城市的建筑风格
    3.未来城市的交通方式
    4.未来城市的居民生活
    5.未来城市的海绵城市建设方案，400字。
    文生图:1.未来城市的全景图，展示城市的整体布局和标志性建筑，分辨率不低于 1k 。
            2.未来城市中一个具有代表性的居民生活区场景图，展示居民的日常生活和周边环境，分辨率不低于 1920×1080 像素。图像风格要求具有科技感和未来感，色彩鲜艳，细节丰富。
    文生视频:1.一段未来城市宣传视频。视频要包含对城市特色和居民生活的介绍。
    文生音频:1.一段时长为 30 秒的未来城市宣传旁白音频，音频格式为 MP3，采样率不低于 44100Hz，比特率不低于 192kbps。旁白要求语音清晰、语速适中、富有感情，能够准确传达未来城市的特色和魅力.
    </refined_tasks>
    <relevance>
    文生文5依赖文生文2和文生文4，
    文生图1依赖文生文1和文生文2，
    文生图2依赖文生文4，
    文生视频1依赖文生文1和文生文4
    文生音频1依赖文生文1，文生文2，文生文3，文生文4，文生文5
    </relevance>
    output:
    {json_example}
    """
    return text2text(prompt)
    pass

def run_task(input:str):
   
   tasks = task_type_division(input)
   print(tasks)
   print("*"*40)


   refined_tasks = task_refinement(tasks)
   print(refined_tasks)
   print("*"*40)

   cot = get_requirements_relevance_cot(input,refined_tasks)
   print(cot)
   print("*"*40)


   relevance = get_requirements_relevance(input,refined_tasks,cot)
   print(relevance)
   print("*"*40)

   
   tasks_json = get_task_json(refined_tasks,relevance)
   print(tasks_json)
   print("*"*40)
   
   with open("tasks.json", "w", encoding="utf-8") as f:
    json.dump(json.loads(tasks_json), f, ensure_ascii=False, indent=4)

   
   from tast_exe import main

   result = main(json.loads(tasks_json))
   return result
   

if __name__ == "__main__":
    tasks_path = ''  # 替换为你的JSON文件路径

    # 2. 打开并读取JSON文件
    with open(tasks_path, 'r', encoding='utf-8') as file:
        # 3. 使用json.load()将文件内容解析为Python字典
        tasks_dict = json.load(file)
    
    for key, task in tasks_dict.items():
        
        if key:

            print(f"当前正在处理{key}这个任务:")
            time.sleep(1)
            task_name = task['name']
            print(task_name)
            try:
                instruction = task['instruction']
                resource = task['resource']

                re = requirements_gathering(instruction)
                print(re)

                re_list = requirements_structuring(re)
                re_list = prompt_construction(re_list)
                re_list = string_to_list(re_list)
                run(task_name,resource,re_list)
            except Exception as e:
                print(f"{key}处理失败")
                print(f"Error occurred while processing task: {task_name}")
            pass
    

    pass